{
 "cells": [
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "Text provided under a Creative Commons Attribution license, CC-BY.  All code is made available under the FSF-approved BSD-3 license.  (c) Lorena A. Barba, Gilbert F. Forsyth 2017. Thanks to NSF for support via CAREER award #1149784."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[@LorenaABarba](https://twitter.com/LorenaABarba)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "12 steps to Navier–Stokes\n",
    "=====\n",
    "***"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We continue our journey to solve the Navier–Stokes equation with Step 4. But don't continue unless you have completed the previous steps! In fact, this next step will be a combination of the two previous ones. The wonders of *code reuse*!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Step 4: Burgers' Equation\n",
    "----\n",
    "***"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can read about Burgers' Equation on its [wikipedia page](http://en.wikipedia.org/wiki/Burgers'_equation).\n",
    "\n",
    "Burgers' equation in one spatial dimension looks like this:\n",
    "\n",
    "$$\\frac{\\partial u}{\\partial t} + u \\frac{\\partial u}{\\partial x} = \\nu \\frac{\\partial ^2u}{\\partial x^2}$$\n",
    "\n",
    "As you can see, it is a combination of non-linear convection and diffusion. It is surprising how much you learn from this neat little equation! \n",
    "\n",
    "We can discretize it using the methods we've already detailed in Steps [1](./01_Step_1.ipynb) to [3](./04_Step_3.ipynb).  Using forward difference for time, backward difference for space and our 2nd-order method for the second derivatives yields:\n",
    "\n",
    "$$\\frac{u_i^{n+1}-u_i^n}{\\Delta t} + u_i^n \\frac{u_i^n - u_{i-1}^n}{\\Delta x} = \\nu \\frac{u_{i+1}^n - 2u_i^n + u_{i-1}^n}{\\Delta x^2}$$\n",
    "\n",
    "As before, once we have an initial condition, the only unknown is $u_i^{n+1}$. We will step in time as follows:\n",
    "\n",
    "$$u_i^{n+1} = u_i^n - u_i^n \\frac{\\Delta t}{\\Delta x} (u_i^n - u_{i-1}^n) + \\nu \\frac{\\Delta t}{\\Delta x^2}(u_{i+1}^n - 2u_i^n + u_{i-1}^n)$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Initial and Boundary Conditions\n",
    "\n",
    "To examine some interesting properties of Burgers' equation, it is helpful to use different initial and boundary conditions than we've been using for previous steps.  \n",
    "\n",
    "Our initial condition for this problem is going to be:\n",
    "\n",
    "\\begin{eqnarray}\n",
    "u &=& -\\frac{2 \\nu}{\\phi} \\frac{\\partial \\phi}{\\partial x} + 4 \\\\\\\n",
    "\\phi &=& \\exp \\bigg(\\frac{-x^2}{4 \\nu} \\bigg) + \\exp \\bigg(\\frac{-(x-2 \\pi)^2}{4 \\nu} \\bigg)\n",
    "\\end{eqnarray}\n",
    "\n",
    "This has an analytical solution, given by:\n",
    "\n",
    "\\begin{eqnarray}\n",
    "u &=& -\\frac{2 \\nu}{\\phi} \\frac{\\partial \\phi}{\\partial x} + 4 \\\\\\\n",
    "\\phi &=& \\exp \\bigg(\\frac{-(x-4t)^2}{4 \\nu (t+1)} \\bigg) + \\exp \\bigg(\\frac{-(x-4t -2 \\pi)^2}{4 \\nu(t+1)} \\bigg)\n",
    "\\end{eqnarray}\n",
    "\n",
    "Our boundary condition will be:\n",
    "\n",
    "$$u(0) = u(2\\pi)$$\n",
    "\n",
    "This is called a *periodic* boundary condition. Pay attention! This will cause you a bit of headache if you don't tread carefully."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Saving Time with SymPy\n",
    "\n",
    "\n",
    "The initial condition we're using for Burgers' Equation can be a bit of a pain to evaluate by hand.  The derivative $\\frac{\\partial \\phi}{\\partial x}$ isn't too terribly difficult, but it would be easy to drop a sign or forget a factor of $x$ somewhere, so we're going to use SymPy to help us out.  \n",
    "\n",
    "[SymPy](http://sympy.org/en/) is the symbolic math library for Python.  It has a lot of the same symbolic math functionality as Mathematica with the added benefit that we can easily translate its results back into our Python calculations (it is also free and open source). \n",
    "\n",
    "Start by loading the SymPy library, together with our favorite library, NumPy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'sympy'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[1], line 2\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01msympy\u001b[39;00m\n",
      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'sympy'"
     ]
    }
   ],
   "source": [
    "import numpy\n",
    "import sympy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We're also going to tell SymPy that we want all of its output to be rendered using $\\LaTeX$. This will make our Notebook beautiful!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sympy import init_printing\n",
    "init_printing(use_latex=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Start by setting up symbolic variables for the three variables in our initial condition and then type out the full equation for $\\phi$.  We should get a nicely rendered version of our $\\phi$ equation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOgAAAAeBAMAAADUTE9PAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEIl2mUTdMiJmu6tU\nze/kkN0jAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC2ElEQVRIDbWUv2/TQBTHv45J7LiuagkWBiRL\ngNSKpT8Qgqke0gISgydQt0aqsrBE0A5sVqlYWCIqEN3SDTHlT4hUJGDrwFyCxIyqMjGVd/ZdnHPe\nJWkQT0r83tf3Pt/Yl3vAVHF0K56qD5i+Ez3rdErT6TuROL0pTZnOJ5OglmiRN/r1Gjh2wHQ6LWV6\nCLdDeahqcVXbcYny+4M3hnIjJ2I6Z1R7tY7qIhW0KA+1HeUWSkGY68OZkbPBdO6q/i913HlERQS4\nb+6JZ6ZInF755OQb0MH3802hmMLImWE6v0qKE9dREXkE+OV2KFIKLy6XbLq2RTEqjByP6ToA9mq1\nWnwVdVwDbtS2ajHsRbgkrqXbsSve3DHTqkkmDma1ZVmxLbWXK2fJpyoVEWB7zW4mi41cqwQTPKmR\nwz1pX7t8luy9z0y9/YVmZio2suUHcMKsNn8bOc+YnmpcEKNCnZbiyIwOIyfi+u4WxLBQp+VnTtQ1\nA8eX70xfbOklX9GujgsDR5OdjxQfMHd+gThljCfkMJ2aVNZeiJidFw1tDI8BeBn/BfCabEr0cQ/T\nI1Q03SgKspYAGsNjAAP97zLTDrBPqvjD7tQBxuFooGkwlQAaJmMAeZP/KvB/oO2GsLe6mSlNKYh5\nVAiDqQRglwVY128zO7VDk6fndPwWsEku6dEk0/6pz52VaYEjAaAxzAAeN5kJY7UqgdOZTaotWMco\n1dbF6CVTZnYqU52jADjgAO4f2HH+u2XmrqzO20sP4ETwI3ra8U9a4CgAtjmA93v55pAnYK3OzyyQ\n3ob7MMlMn//sojg71xuNX43GU1pY5CiAxwHmOoxlLr3NUjVuo/yOyuTrNXHkGNYBc6HqZq92ksri\nnFJws1OZhumK4a9sDOuACi3uDi/tK0E/o8QaLGQuTY0crUcW1WNcSRjWxJI0vRhneWVxYgNuoTTF\nv3I4tlFTpsYF/+MGM47H2fwF7Ab2ldJPuIkAAAAASUVORK5CYII=\n",
      "text/latex": [
       "$$e^{- \\frac{\\left(- 4 t + x - 2 \\pi\\right)^{2}}{4 \\nu \\left(t + 1\\right)}} + e^{- \\frac{\\left(- 4 t + x\\right)^{2}}{4 \\nu \\left(t + 1\\right)}}$$"
      ],
      "text/plain": [
       "                  2                2 \n",
       " -(-4⋅t + x - 2⋅π)      -(-4⋅t + x)  \n",
       " ───────────────────    ─────────────\n",
       "     4⋅ν⋅(t + 1)         4⋅ν⋅(t + 1) \n",
       "ℯ                    + ℯ             "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x, nu, t = sympy.symbols('x nu t')\n",
    "phi = (sympy.exp(-(x - 4 * t)**2 / (4 * nu * (t + 1))) +\n",
    "       sympy.exp(-(x - 4 * t - 2 * sympy.pi)**2 / (4 * nu * (t + 1))))\n",
    "phi"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It's maybe a little small, but that looks right.  Now to evaluate our partial derivative $\\frac{\\partial \\phi}{\\partial x}$ is a trivial task.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$$- \\frac{e^{- \\frac{\\left(- 4 t + x\\right)^{2}}{4 \\nu \\left(t + 1\\right)}}}{4 \\nu \\left(t + 1\\right)} \\left(- 8 t + 2 x\\right) - \\frac{1}{4 \\nu \\left(t + 1\\right)} \\left(- 8 t + 2 x - 4 \\pi\\right) e^{- \\frac{\\left(- 4 t + x - 2 \\pi\\right)^{2}}{4 \\nu \\left(t + 1\\right)}}$$"
      ],
      "text/plain": [
       "                           2                                         2 \n",
       "                -(-4⋅t + x)                         -(-4⋅t + x - 2⋅π)  \n",
       "                ─────────────                       ───────────────────\n",
       "                 4⋅ν⋅(t + 1)                            4⋅ν⋅(t + 1)    \n",
       "  (-8⋅t + 2⋅x)⋅ℯ                (-8⋅t + 2⋅x - 4⋅π)⋅ℯ                   \n",
       "- ─────────────────────────── - ───────────────────────────────────────\n",
       "          4⋅ν⋅(t + 1)                         4⋅ν⋅(t + 1)              "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "phiprime = phi.diff(x)\n",
    "phiprime"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If you want to see the unrendered version, just use the Python print command."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-(-8*t + 2*x)*exp(-(-4*t + x)**2/(4*nu*(t + 1)))/(4*nu*(t + 1)) - (-8*t + 2*x - 4*pi)*exp(-(-4*t + x - 2*pi)**2/(4*nu*(t + 1)))/(4*nu*(t + 1))\n"
     ]
    }
   ],
   "source": [
    "print(phiprime)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Now what?\n",
    "\n",
    "\n",
    "Now that we have the Pythonic version of our derivative, we can finish writing out the full initial condition equation and then translate it into a usable Python expression.  For this, we'll use the *lambdify* function, which takes a SymPy symbolic equation and turns it into a callable function.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-2*nu*(-(-8*t + 2*x)*exp(-(-4*t + x)**2/(4*nu*(t + 1)))/(4*nu*(t + 1)) - (-8*t + 2*x - 4*pi)*exp(-(-4*t + x - 2*pi)**2/(4*nu*(t + 1)))/(4*nu*(t + 1)))/(exp(-(-4*t + x - 2*pi)**2/(4*nu*(t + 1))) + exp(-(-4*t + x)**2/(4*nu*(t + 1)))) + 4\n"
     ]
    }
   ],
   "source": [
    "from sympy.utilities.lambdify import lambdify\n",
    "\n",
    "u = -2 * nu * (phiprime / phi) + 4\n",
    "print(u)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Lambdify\n",
    "\n",
    "To lambdify this expression into a useable function, we tell lambdify which variables to request and the function we want to plug them in to."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.49170664206\n"
     ]
    }
   ],
   "source": [
    "ufunc = lambdify((t, x, nu), u)\n",
    "print(ufunc(1, 4, 3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Back to Burgers' Equation\n",
    "\n",
    "Now that we have the initial conditions set up, we can proceed and finish setting up the problem.  We can generate the plot of the initial condition using our lambdify-ed function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 4.        ,  4.06283185,  4.12566371,  4.18849556,  4.25132741,\n",
       "        4.31415927,  4.37699112,  4.43982297,  4.50265482,  4.56548668,\n",
       "        4.62831853,  4.69115038,  4.75398224,  4.81681409,  4.87964594,\n",
       "        4.9424778 ,  5.00530965,  5.0681415 ,  5.13097336,  5.19380521,\n",
       "        5.25663706,  5.31946891,  5.38230077,  5.44513262,  5.50796447,\n",
       "        5.57079633,  5.63362818,  5.69646003,  5.75929189,  5.82212374,\n",
       "        5.88495559,  5.94778745,  6.0106193 ,  6.07345115,  6.136283  ,\n",
       "        6.19911486,  6.26194671,  6.32477856,  6.38761042,  6.45044227,\n",
       "        6.51327412,  6.57610598,  6.63893783,  6.70176967,  6.76460125,\n",
       "        6.82742866,  6.89018589,  6.95176632,  6.99367964,  6.72527549,\n",
       "        4.        ,  1.27472451,  1.00632036,  1.04823368,  1.10981411,\n",
       "        1.17257134,  1.23539875,  1.29823033,  1.36106217,  1.42389402,\n",
       "        1.48672588,  1.54955773,  1.61238958,  1.67522144,  1.73805329,\n",
       "        1.80088514,  1.863717  ,  1.92654885,  1.9893807 ,  2.05221255,\n",
       "        2.11504441,  2.17787626,  2.24070811,  2.30353997,  2.36637182,\n",
       "        2.42920367,  2.49203553,  2.55486738,  2.61769923,  2.68053109,\n",
       "        2.74336294,  2.80619479,  2.86902664,  2.9318585 ,  2.99469035,\n",
       "        3.0575222 ,  3.12035406,  3.18318591,  3.24601776,  3.30884962,\n",
       "        3.37168147,  3.43451332,  3.49734518,  3.56017703,  3.62300888,\n",
       "        3.68584073,  3.74867259,  3.81150444,  3.87433629,  3.93716815,  4.        ])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from matplotlib import pyplot\n",
    "%matplotlib inline\n",
    "\n",
    "###variable declarations\n",
    "nx = 101\n",
    "nt = 100\n",
    "dx = 2 * numpy.pi / (nx - 1)\n",
    "nu = .07\n",
    "dt = dx * nu\n",
    "\n",
    "x = numpy.linspace(0, 2 * numpy.pi, nx)\n",
    "un = numpy.empty(nx)\n",
    "t = 0\n",
    "\n",
    "u = numpy.asarray([ufunc(t, x0, nu) for x0 in x])\n",
    "u"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1100x700 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pyplot.figure(figsize=(11, 7), dpi=100)\n",
    "pyplot.plot(x, u, marker='o', lw=2)\n",
    "pyplot.xlim([0, 2 * numpy.pi])\n",
    "pyplot.ylim([0, 10]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is definitely not the hat function we've been dealing with until now. We call it a \"saw-tooth function\".  Let's proceed forward and see what happens.  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Periodic Boundary Conditions\n",
    "\n",
    "One of the big differences between Step 4 and the previous lessons is the use of *periodic* boundary conditions.  If you experiment with Steps 1 and 2 and make the simulation run longer (by increasing `nt`) you will notice that the wave will keep moving to the right until it no longer even shows up in the plot.  \n",
    "\n",
    "With periodic boundary conditions, when a point gets to the right-hand side of the frame, it *wraps around* back to the front of the frame.  \n",
    "\n",
    "Recall the discretization that we worked out at the beginning of this notebook:\n",
    "\n",
    "$$u_i^{n+1} = u_i^n - u_i^n \\frac{\\Delta t}{\\Delta x} (u_i^n - u_{i-1}^n) + \\nu \\frac{\\Delta t}{\\Delta x^2}(u_{i+1}^n - 2u_i^n + u_{i-1}^n)$$\n",
    "\n",
    "What does $u_{i+1}^n$ *mean* when $i$ is already at the end of the frame?\n",
    "\n",
    "Think about this for a minute before proceeding.  \n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "for n in range(nt):\n",
    "    un = u.copy()\n",
    "    for i in range(1, nx-1):\n",
    "        u[i] = un[i] - un[i] * dt / dx *(un[i] - un[i-1]) + nu * dt / dx**2 *\\\n",
    "                (un[i+1] - 2 * un[i] + un[i-1])\n",
    "    u[0] = un[0] - un[0] * dt / dx * (un[0] - un[-2]) + nu * dt / dx**2 *\\\n",
    "                (un[1] - 2 * un[0] + un[-2])\n",
    "    u[-1] = u[0]\n",
    "        \n",
    "u_analytical = numpy.asarray([ufunc(nt * dt, xi, nu) for xi in x])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nb7yx0zEdTdySR5IkSRKQnFJ6zjnntNlU/tJLL2XhwoUsWLCg0/t873vfY/DgwcycOZOLLrqI8847\nj+nTp3d63TnnnENxcTHnnXcexxyTurPrv/7rvxKPxykpKWH48OFtrl+cOHEif/7zn3nttdeYMWMG\nZ5xxBn/84x/JyMggFovx4IMP8sorr1BaWsoNN9zAf/3Xf3U6pqNJEHWz50lvC4KgAKitra2loKAg\n3cORJEmSuq2xsZFVq1YxduxYcnJy0j2cfmPHjh0cc8wxzJkzh7//+79P93D6tI6+xurq6loCfmEU\nRXVdvafTSiVJkiSlVRiG1NTUcMcdd1BYWMjf/d3fpXtIRyXDoSRJkqS0WrNmDWPHjuW4447jZz/7\nGRkZxpR08G9dkiRJUlqNGTOGvrbc7WjkhjSSJEmSJMOhJEmS1Fushqm39MbXluFQkiRJ6mGZmZlA\ncvdNqTe0fG21fK31BNccSpIkST0sHo8zaNAgNmzYAEBubi5BEKR5VDoSRFHEjh072LBhA4MGDSIe\nj/fYvQ2HkiRJUi8oKioCaA2IUk8aNGhQ69dYTzEcSpIkSb0gCAKKi4sZMWIEe/bsSfdwdATJzMzs\n0YphC8OhJEmS1Ivi8Xiv/CAv9TQ3pJEkSZIkGQ4lSZIkSYZDSZIkSRKGQ0mSJEkShkNJkiRJEoZD\nSZIkSRKGQ0mSJEkShkNJkiRJEoZDSZIkSRKGQ0mSJEkShkNJkiRJEoZDSZIkSRKGQ0mSJEkShkNJ\nkiRJEoZDSZIkSRKGQ0mSJEkShkNJkiRJEoZDSZIkSRKGQ0mSJEkShkNJkiRJEoZDSZIkSRKGQ0mS\nJEkShkNJkiRJEoZDSZIkSRKGQ0mSJEkShkNJkiRJEoZDSZIkSRKGQ0mSJEkShkNJkiRJEoZDSZIk\nSRKGQ0mSJEkShkNJkiRJEoZDSZIkSRKGQ0mSJEkShkNJkiRJEoZDSZIkSRKGQ0mSJEkShkNJkiRJ\nEoZDSZIkSRKGQ0mSJEkShkNJkiRJEoZDSZIkSRKGQ0mSJEkShkNJkiRJEoZDSZIkSRKGQ0mSJEkS\nvRAOgyDICILgW0EQrAqCYGcQBG8GQfD1IAgMopIkSZLUR2X0wj2/AnwO+BSwGDgFuBeoBb7fC8+T\nJEmSJB2i3giHZwB/jKLoseaPVwdB8HGSIfEAQRBkA9n7vJTfC2OSJEmSJHWgN6Z6VgLvD4JgIkAQ\nBCcC5cDj7Zz/VZJVxZY/7/TCmCRJkiRJHeiNyuFtQCGwLAiCBBAHvhZF0a/aOf8/gf/e5+N8DIiS\nJEmSdFj1Rjj8KHAF8AmSaw5PAu4MgmBtFEU/3//kKIp2AbtaPg6CoBeGJEmSJEnqSG+Ew/8CvhNF\n0YPNH1cFQTCa5PTRA8KhJEmSJCn9emPNYS4Q7vdaopeeJUmSJEnqAb1ROXwE+FoQBGtITit9D/Al\nYE4vPEuSJEmS1AN6IxxeD9wK3A2MANYCPwK+2QvPkiRJkiT1gB4Ph1EU1QNfbP4jSZIkSeoHXAco\nSZIkSTIcSpIkSZIMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5Ik\nSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJ\nkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmS\nJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIk\nDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQM\nh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyH\nkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeS\nJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5Ik\nSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJ\nkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmS\nJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJAyHkiRJkiQMh5IkSZIk\nDIeSJEmSJAyHkiRJkiQMh5IkSZIkDIeSJEmSJHopHAZBcGwQBPcHQbA5CIIdQRAsDILg5N54liRJ\n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\nUTul33nB2kvOCxabp1RORrWVhSRJklQKd9w4k3nTqgcsWBOAuVOrgMCx1oGvmTapgpaegjTFVgVt\nPq9rieFQkiRJ15xMEnj03at56LGtAxaC+dTPrQEY9JrPvK8e4LKrgr1jujKoq9mo9jm8Ep45lCRJ\n0kgZrIfhUPocWkVUV6OyaWXxZhkOJUmSNJKGEuwMf7qWlE1BGkmSJKmcDGW7p1tCpdHpcyhJkiRJ\nusoYDiVJkiRJhkNJkiRJkuFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmS\nhOFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE\n4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoTh\nUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmShOFQ\nkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE4VCS\nJEmShOFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoThUJIk\nSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJ\nkoThUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmS\nhOFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE\n4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoTh\nUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmShOFQkiRJkoThUJIkSZKE4VCSJEmSxCiG\nwxDCx0II+0IIHSGELSGE9aM1liRJkiTpzRmVcBhC+BXg88AfAbcAG4HvhhAWjMZ4kiRJkqQ3J8QY\nR/6mITwDbI0xPtTnsZ3At2KMn7zk2iqgqs9DNcDhQ4cOMXXq1BGfmyRJkiRdy1pbW5k/fz7AtBhj\n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\n",
      "text/plain": [
       "<Figure size 1100x700 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pyplot.figure(figsize=(11, 7), dpi=100)\n",
    "pyplot.plot(x,u, marker='o', lw=2, label='Computational')\n",
    "pyplot.plot(x, u_analytical, label='Analytical')\n",
    "pyplot.xlim([0, 2 * numpy.pi])\n",
    "pyplot.ylim([0, 10])\n",
    "pyplot.legend();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "***\n",
    "\n",
    "What next?\n",
    "----\n",
    "\n",
    "The subsequent steps, from 5 to 12, will be in two dimensions. But it is easy to extend the 1D finite-difference formulas to the partial derivatives in 2D or 3D. Just apply the definition — a partial derivative with respect to $x$ is the variation in the $x$ direction *while keeping $y$ constant*.\n",
    "\n",
    "Before moving on to [Step 5](./07_Step_5.ipynb), make sure you have completed your own code for steps 1 through 4 and you have experimented with the parameters and thought about what is happening. Also, we recommend that you take a slight break to learn about [array operations with NumPy](./06_Array_Operations_with_NumPy.ipynb)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<link href='http://fonts.googleapis.com/css?family=Fenix' rel='stylesheet' type='text/css'>\n",
       "<link href='http://fonts.googleapis.com/css?family=Alegreya+Sans:100,300,400,500,700,800,900,100italic,300italic,400italic,500italic,700italic,800italic,900italic' rel='stylesheet' type='text/css'>\n",
       "<link href='http://fonts.googleapis.com/css?family=Source+Code+Pro:300,400' rel='stylesheet' type='text/css'>\n",
       "<style>\n",
       "    @font-face {\n",
       "        font-family: \"Computer Modern\";\n",
       "        src: url('http://mirrors.ctan.org/fonts/cm-unicode/fonts/otf/cmunss.otf');\n",
       "    }\n",
       "    div.cell{\n",
       "        width:800px;\n",
       "        margin-left:16% !important;\n",
       "        margin-right:auto;\n",
       "    }\n",
       "    h1 {\n",
       "        font-family: 'Alegreya Sans', sans-serif;\n",
       "    }\n",
       "    h2 {\n",
       "        font-family: 'Fenix', serif;\n",
       "    }\n",
       "    h3{\n",
       "\t\tfont-family: 'Fenix', serif;\n",
       "        margin-top:12px;\n",
       "        margin-bottom: 3px;\n",
       "       }\n",
       "\th4{\n",
       "\t\tfont-family: 'Fenix', serif;\n",
       "       }\n",
       "    h5 {\n",
       "        font-family: 'Alegreya Sans', sans-serif;\n",
       "    }\t   \n",
       "    div.text_cell_render{\n",
       "        font-family: 'Alegreya Sans',Computer Modern, \"Helvetica Neue\", Arial, Helvetica, Geneva, sans-serif;\n",
       "        line-height: 135%;\n",
       "        font-size: 120%;\n",
       "        width:600px;\n",
       "        margin-left:auto;\n",
       "        margin-right:auto;\n",
       "    }\n",
       "    .CodeMirror{\n",
       "            font-family: \"Source Code Pro\";\n",
       "\t\t\tfont-size: 90%;\n",
       "    }\n",
       "/*    .prompt{\n",
       "        display: None;\n",
       "    }*/\n",
       "    .text_cell_render h1 {\n",
       "        font-weight: 200;\n",
       "        font-size: 50pt;\n",
       "\t\tline-height: 100%;\n",
       "        color:#CD2305;\n",
       "        margin-bottom: 0.5em;\n",
       "        margin-top: 0.5em;\n",
       "        display: block;\n",
       "    }\t\n",
       "    .text_cell_render h5 {\n",
       "        font-weight: 300;\n",
       "        font-size: 16pt;\n",
       "        color: #CD2305;\n",
       "        font-style: italic;\n",
       "        margin-bottom: .5em;\n",
       "        margin-top: 0.5em;\n",
       "        display: block;\n",
       "    }\n",
       "    \n",
       "    .warning{\n",
       "        color: rgb( 240, 20, 20 )\n",
       "        }  \n",
       "</style>\n",
       "<script>\n",
       "    MathJax.Hub.Config({\n",
       "                        TeX: {\n",
       "                           extensions: [\"AMSmath.js\"]\n",
       "                           },\n",
       "                tex2jax: {\n",
       "                    inlineMath: [ ['$','$'], [\"\\\\(\",\"\\\\)\"] ],\n",
       "                    displayMath: [ ['$$','$$'], [\"\\\\[\",\"\\\\]\"] ]\n",
       "                },\n",
       "                displayAlign: 'center', // Change this to 'center' to center equations.\n",
       "                \"HTML-CSS\": {\n",
       "                    styles: {'.MathJax_Display': {\"margin\": 4}}\n",
       "                }\n",
       "        });\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.core.display import HTML\n",
    "def css_styling():\n",
    "    styles = open(\"../styles/custom.css\", \"r\").read()\n",
    "    return HTML(styles)\n",
    "css_styling()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
